﻿using Microsoft.WindowsAzure;
using Microsoft.WindowsAzure.Storage;
using Microsoft.WindowsAzure.Storage.Table;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace TresEnRaya.Data
{
    public class DatosPartida
    {
        static CloudTable _solicitudes;
        static CloudTable _partidas;
        static CloudTable _jugadores;
        static CloudTable _jugadoresPorId;

        static DatosPartida()
        {
            // Retrieve the storage account from the connection string.
            CloudStorageAccount storageAccount = CloudStorageAccount.Parse(
                CloudConfigurationManager.GetSetting("StorageConnectionString"));

            // Create the table client.
            CloudTableClient tableClient = storageAccount.CreateCloudTableClient();

            // Create the table if it doesn't exist.
            _solicitudes = tableClient.GetTableReference("Solicitudes");
            _solicitudes.CreateIfNotExists();

            _partidas = tableClient.GetTableReference("Partidas");
            _partidas.CreateIfNotExists();

            _jugadores = tableClient.GetTableReference("Jugadores");
            _jugadores.CreateIfNotExists();

            _jugadoresPorId = tableClient.GetTableReference("JugadoresPorId");
            _jugadoresPorId.CreateIfNotExists();
        }

        public DatosPartida()
        {
        }

        public Jugador NuevoJugador(string pais, string nombre, string id)
        {
            var jugador = new Jugador(pais, nombre, id);
            TableOperation insertJugador = TableOperation.InsertOrReplace(jugador);
            _jugadores.Execute(insertJugador);

            TableOperation insertJugadorId = TableOperation.InsertOrReplace(new JugadorPorId(id, pais, nombre));
            _jugadoresPorId.Execute(insertJugadorId);
            return jugador;
        }

        public Jugador NuevaSolicitud(Jugador jugador)
        {
            var solicitud = new Jugador(jugador.Pais, jugador.Nombre, jugador.Id);
            TableOperation operation = TableOperation.InsertOrReplace(solicitud);
            _solicitudes.Execute(operation);
            return solicitud;
        }

        public Jugador ObtenerSolicitud(string pais, string nombre)
        {
            var op = TableOperation.Retrieve<Jugador>(pais, nombre);
            var result = _solicitudes.Execute(op);
            var solicitud = result.Result as Jugador;
            return solicitud;
        }

        public bool BorrarSolicitud(Jugador solicitud)
        {
            var op = TableOperation.Delete(solicitud);
            var result = _solicitudes.Execute(op);
            return result.HttpStatusCode == 204;
        }

        public Partida EmpezarPartida(string pais, Jugador jugador1, Jugador jugador2)
        {
            var partida = new Partida(pais, Guid.NewGuid().ToString())
            {
                Jugador1 = jugador1,
                Jugador2 = jugador2
            };
            var empiezaPartidaOp = TableOperation.InsertOrReplace(partida);
            _partidas.Execute(empiezaPartidaOp);
            return partida;
        }

        public Jugador ObtenerJugador(string pais, string id)
        {
            var op = TableOperation.Retrieve<JugadorPorId>(pais, id);
            var jugadorxid = _jugadoresPorId.Execute(op).Result as JugadorPorId;
            if (jugadorxid != null)
            {
                op = TableOperation.Retrieve<Jugador>(pais, jugadorxid.Nombre);
                return _jugadores.Execute(op).Result as Jugador;
            }
            return null;
        }

        public Partida ObtenerPartida(string pais, string id)
        {
            var op = TableOperation.Retrieve<Partida>(pais, id);
            return _partidas.Execute(op).Result as Partida;
        }

        public void GuardarMovimiento(Partida partida)
        {
            var replaceOp = TableOperation.Replace(partida);
            _partidas.Execute(replaceOp);
        }

        public IEnumerable<Jugador> ListaDisponibles(string pais)
        {
            var solicitudQuery = new TableQuery<Jugador>().Where(
               TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, pais));
            return _solicitudes.ExecuteQuery<Jugador>(solicitudQuery);
        }
    }

    //public void BorrarJugador(string pais, string id)
    //{
    //    var jugadorId = ObtenerJugador(pais, id);
    //    if (jugadorId != null)
    //    {
    //        var deleteJidOperation = TableOperation.Delete(jugadorId);
    //        _jugadoresPorId.Execute(deleteJidOperation);

    //        var retrieveJugador = TableOperation.Retrieve<Jugador>(jugadorId.Pais, jugadorId.Nombre);
    //        var jugador = _jugadores.Execute(retrieveJugador).Result as Jugador;

    //        if (jugador != null)
    //        {
    //            var deleteJugador = TableOperation.Delete(jugador);
    //            _jugadores.Execute(deleteJugador);
    //        }

    //        var solicitud = SolicitudDeJugador(jugadorId.Pais, jugadorId.Nombre);

    //        if (solicitud != null)
    //        {
    //            var delSolicitud = TableOperation.Delete(solicitud);
    //            _solicitudes.Execute(delSolicitud);
    //        }
    //    }
    //}

    //public Jugador SolicitudDeJugador(string pais, string id)
    //{
    //    var jugador = ObtenerJugador(pais, id);
    //    if (jugador != null)
    //    {
    //        var retrieveSolicitud = TableOperation.Retrieve<Jugador>(pais, jugador.Nombre);
    //        return _solicitudes.Execute(retrieveSolicitud).Result as Jugador;
    //    }
    //    return null;
    //}
}